在H2中,每个数据库的表记录和表元数据放在一个以"h2.db"结尾的文件中, 比如"test.h2.db"就是存放"test"这个数据库的文件 "h2.db"文件的格式: 如果"h2.db"文件不需要加密,下列三个字段都相同,都是"-- H2 0.5/B -- \n"(16个字节) 此文为了简单起见,不考虑加密的情况 字节数 用意 ======================== 16 magic 16 salt 16 magic (这三项的写入和读取在org.h2.store.FileStore.init()) 接下来是每个Page StaticHeader ================= 4 pageSize 默认是2048(2K) 1 WRITE_VERSION 常量3 1 READ_VERSION 常量3 1994 保留 (这4项的写入在org.h2.store.PageStore.writeStaticHeader()) (以上7项刚好是2k) VariableHeader ================= 4 CRC 8 writeCount 4 logKey 4 logFirstTrunkPage 4 logFirstDataPage 2024 保留(补够2k) 4 CRC 8 writeCount 4 logKey 4 logFirstTrunkPage 4 logFirstDataPage 2024 保留(补够2k) (上面两者相同,后者只有在前者无效时(比如CRC错了)才有用) (这12项的写入在org.h2.store.PageStore.writeVariableHeader()) 第一个PageFreeList的pageId是3 第4个page也就是pageId=4的页放metaIndex java.lang.Error at org.h2.store.PageStore.allocatePage(PageStore.java:1113) at org.h2.store.PageStore.update(PageStore.java:1062) at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:231) at org.h2.index.PageDataIndex.<init>(PageDataIndex.java:82) at org.h2.table.RegularTable.<init>(RegularTable.java:86) at org.h2.store.PageStore.openMetaIndex(PageStore.java:1570) at org.h2.store.PageStore.openNew(PageStore.java:306) at org.h2.store.PageStore.open(PageStore.java:288) at org.h2.engine.Database.getPageStore(Database.java:2123) at org.h2.engine.Database.open(Database.java:582) at org.h2.engine.Database.openDatabase(Database.java:222) at org.h2.engine.Database.<init>(Database.java:217) at org.h2.engine.Engine.openSession(Engine.java:56) at org.h2.engine.Engine.openSession(Engine.java:159) at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138) at org.h2.engine.Engine.createSession(Engine.java:121) at org.h2.server.TcpServerThread.run(TcpServerThread.java:136) at java.lang.Thread.run(Thread.java:662) 第5个page也就是pageId=5的页放PageStreamTrunk 然后再预分配PageStreamTrunk.getPagesAddressed(pageSize)个页给PageStreamData 先写PageStreamTrunk java.lang.Error at org.h2.store.PageStore.writePage(PageStore.java:1337) at org.h2.store.PageStreamTrunk.write(PageStreamTrunk.java:140) at org.h2.store.PageOutputStream.initNextData(PageOutputStream.java:100) at org.h2.store.PageOutputStream.reserve(PageOutputStream.java:78) at org.h2.store.PageLog.openForWriting(PageLog.java:186) at org.h2.store.PageStore.openNew(PageStore.java:308) at org.h2.store.PageStore.open(PageStore.java:288) at org.h2.engine.Database.getPageStore(Database.java:2123) at org.h2.engine.Database.open(Database.java:582) at org.h2.engine.Database.openDatabase(Database.java:222) at org.h2.engine.Database.<init>(Database.java:217) at org.h2.engine.Engine.openSession(Engine.java:56) at org.h2.engine.Engine.openSession(Engine.java:159) at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138) at org.h2.engine.Engine.createSession(Engine.java:121) at org.h2.server.TcpServerThread.run(TcpServerThread.java:136) at java.lang.Thread.run(Thread.java:662)